package domain;


import java.io.IOException;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Vector;

import exceptions.BierExistiertBereitsException;
import exceptions.BierNichtGefundenException;
import persistence.FilepersistenceManager;
import persistence.PersistenceManager;
import valueobjects.Artikel;
import valueobjects.KaufeArtikel;


public class ArtikelMg {
	
	private Vector<Artikel> artikelBestand = new Vector<Artikel>();
	
	private PersistenceManager pm = new FilepersistenceManager();
	

	public void liesDaten(String datei) throws IOException {
	
		pm.openForReading(datei);

		Artikel einArtikel;
		do {
			einArtikel = pm.ladeArtikel();
			if (einArtikel != null) {
				try {
					einfuegen(einArtikel);
				} catch (BierExistiertBereitsException e) {}
			}
		} while (einArtikel != null);

		pm.close();
		
	}


	public void schreibeDaten(String datei) throws IOException  {

		pm.openForWriting(datei);

		Iterator<Artikel> iter = artikelBestand.iterator();
		while (iter.hasNext()) {
			Artikel a = iter.next();
			pm.speichereArtikel(a);				
		}
		
		pm.close();
		
	}
		
	
	public Artikel suchEinArtikel(String bierName) throws BierNichtGefundenException {
				
		Iterator<Artikel> iter = artikelBestand.iterator();
		while (iter.hasNext()) {
			Artikel artikel = iter.next();
			if ( artikel.getName().equals(bierName)) {
				return artikel;
			}
		}
		throw new BierNichtGefundenException();
		
	}
	

	public Vector<Artikel> sucheArtikelNachName (String artikelName) throws BierNichtGefundenException{
		
		Vector<Artikel> ergebnis = new Vector<Artikel>();
		
		Iterator<Artikel> iter = artikelBestand.iterator();
		while (iter.hasNext()){
			Artikel a = iter.next();
			if (a.getName().equals(artikelName)){
				ergebnis.add(a);
			}
		}
		if(ergebnis.isEmpty()){
			throw new BierNichtGefundenException();
		}

		return ergebnis;
	}
	
	
	public Vector<Artikel> getArtikel() {
		
		return artikelBestand;
		
	}
	
	
	public void einfuegen(Artikel einArtikel) throws BierExistiertBereitsException {
		
		if (artikelBestand.contains(einArtikel)) {
			throw new BierExistiertBereitsException(einArtikel, " - in 'einfuegen()'");
		}

		artikelBestand.add(einArtikel);
		
	}
	
	
	public boolean loeschenBier(Artikel a) throws BierNichtGefundenException{
		
		try{
			boolean ok = artikelBestand.remove(a);
			return true;
		}catch (Exception e){
			e.printStackTrace();
			return false;
		}
		
	}
	

	public boolean nachIDSortieren() {
		
		try{
		Collections.sort(artikelBestand, new Comparator() {
			public int compare(Object t1, Object t2) {
				Artikel a1 = (Artikel) t1;
				Artikel a2 = (Artikel) t2;
				return (a1.getID()).compareTo((a2.getID()));
			}
		});
		return true;
		}catch(Exception e){
			e.printStackTrace();
			return false;
		}
	}
	
	
	///---Warenkorb---///

	public float summeBerechnen(Vector<KaufeArtikel> artikel) {

		float summe = 0;
		Iterator<KaufeArtikel> iter = artikel.iterator();
		while(iter.hasNext()){
			KaufeArtikel kArtikel = (KaufeArtikel)iter.next();
			summe = summe + (kArtikel.getPreis()* kArtikel.getMenge());
		}
		return summe;
		
	}


	///---Kasse---///
	
	public boolean mengeNachEinkauf(Vector<KaufeArtikel> warenkorb) {
		
		Iterator iter = artikelBestand.iterator();
		while(iter.hasNext()){
			Artikel a = (Artikel)iter.next();
			
			Iterator<KaufeArtikel> iter2 = warenkorb.iterator();
			while(iter2.hasNext()){
				KaufeArtikel kArtikel = (KaufeArtikel)iter2.next();
				if(a.getID() == kArtikel.getID()){
					a.setMenge(a.getMenge()- kArtikel.getMenge());
				}
			}
		}
		
		return true;
		
	}

}
